/*获得最长公共前缀
执行用时: 76 ms, 在Longest Common Prefix的JavaScript提交中击败了81.69% 的用户
*/
Array.prototype.longestCommonPrefix = function () {
    if (this.length == 0) {
        return ''
    }
    var strsArr = this.slice();
    var shortStr = '', resultStr = '', key;
    shortStr = strsArr[0]
    for (var i = 1; i < strsArr.length; i++) {
        if (strsArr[i].length <= shortStr.length) {
            shortStr = strsArr[i]
        }
    }
    for (i = 0; i < shortStr.length; i++) {
        k = 0;
        for (var j = 0; j < strsArr.length; j++) {
            if (strsArr[j].startsWith(shortStr.slice(0, i + 1))) {
                k++;
            }
        }
        if (k == strsArr.length) {
            resultStr = shortStr.slice(0, i + 1)
        }
    }
    return resultStr;
}


/*
* 给定一个排序数组，你需要在原地删除重复出现的元素，使得每个元素只出现一次，返回移除后数组的新长度。不要使用额外的数组空间，
* 你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
* eg:
* 给定 nums = [0,0,1,1,1,2,2,3,3,4],
* 函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
* 你不需要考虑数组中超出新长度后面的元素。
*
* 执行用时: 252 ms, 在Remove Duplicates from Sorted Array的JavaScript提交中击败了33.99% 的用户
* */
Array.prototype.removeDuplicates = function () {
    for (var i = 0; i < this.length;) {
        if (this[i] == this[i + 1]) {
            this.splice(i, 1);
        } else {
            i++
        }
    }
    return this.length
}


/*
给定一个数组 nums 和一个值 val，你需要原地移除所有数值等于 val 的元素，返回移除后数组的新长度。
不要使用额外的数组空间，你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1:
给定 nums = [3,2,2,3], val = 3,
函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
你不需要考虑数组中超出新长度后面的元素。
*/
Array.prototype.removeElement = function (val) {
    while (this.indexOf(val) > -1) {
        this.splice(this.indexOf(val), 1)
    }
    return this.length
}

/*
* 给定一个排序数组和一个目标值，在数组中找到目标值，并返回其索引。
* 如果目标值不存在于数组中，返回它将会被按顺序插入的位置。
* 你可以假设数组中无重复元素。
* 输入: [1,3,5,6], 5
* 输出: 2
* 输入: [1,3,5,6], 7
* 输出: 4
* 输入: [1,3,5,6], 0
* 输出: 0
* 执行用时: 76 ms, 在Search Insert Position的JavaScript提交中击败了62.05% 的用户
* */
Array.prototype.searchInsert = function (target) {
    var nums = this.slice()
    if (nums.indexOf(target) > -1) {
        return nums.indexOf(target);
    }
    if (target >= nums[0] && target <= nums[nums.length - 1]) {
        for (var i = 0; i < nums.length - 1; i++) {
            if (target >= nums[i] && target <= nums[i + 1]) {
                return i + 1;
            }
        }
    } else {
        return target < nums[0] ? 0 : nums.length
    }
}

/*
    * 给定一个整数数组 nums ，找到一个具有最大和的连续子数组（子数组最少包含一个元素），返回其最大子串。
    * 输入: [-2,1,-3,4,-1,2,1,-5,4],
    * 输出: 6
    * 解释: 连续子数组 [4,-1,2,1] 的和最大，为 6。
    * */

Array.prototype.maxSubArray = function () {
    var sum = this[0];
    var n = this[0];
    for (var i = 1; i < this.length; i++) {
        if (n > 0) {
            n = n + this[i];
        } else {
            n = this[i]
        }
        if (sum < n) {
            sum = n
        }
    }
    return sum;
}

/*
    * 给定一个由整数组成的非空数组所表示的非负整数，在该数的基础上加一。
    * 最高位数字存放在数组的首位， 数组中每个元素只存储一个数字。
    * 你可以假设除了整数 0 之外，这个整数不会以零开头。
    * 输入: [1,2,3]
    * 输出: [1,2,4]
    * 解释: 输入数组表示数字 123。
    *
    * 执行用时: 76 ms, 在Plus One的JavaScript提交中击败了63.69% 的用户
    * */
Array.prototype.plusOne = function () {
    var digitsList = this.slice();
    digitsList[digitsList.length - 1]++;
    for (var i = digitsList.length - 1; i > 0; i--) {
        if (digitsList[i] === 10) {
            digitsList[i] = 0
            digitsList[i - 1]++;
        }
    }
    if (digitsList[0] === 10) {
        digitsList[0] = 0
        digitsList.unshift(1)
    }

    return digitsList
}